package Lucene;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.LongField;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig.OpenMode;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.Term;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Date;

public class LineIndexMaker {
  
  public LineIndexMaker() {}
  
  public void ACT001_doIndex(String dirPath_docs, String dirPath_indexs)
  {
	    System.out.println("-------------------Do index file-------------------");
	    
	    Date start = new Date();
	    try 
	    {
	      System.out.println("Indexing to directory '" + dirPath_indexs + "'...");
	      Directory dir = FSDirectory.open(new File(dirPath_indexs));
	      Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_40);
	      IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_40, analyzer);
	      boolean create = true;
	      if (create) 
	      {
	        // Create a new index in the directory, removing any
	        // previously indexed documents:
	        iwc.setOpenMode(OpenMode.CREATE);
	      } else 
	      {
	        // Add new documents to an existing index:
	        iwc.setOpenMode(OpenMode.CREATE_OR_APPEND);
	      }
	      // Optional: for better indexing performance, if you
	      // are indexing many documents, increase the RAM
	      // buffer.  But if you do this, increase the max heap
	      // size to the JVM (eg add -Xmx512m or -Xmx1g):
	      //
	      // iwc.setRAMBufferSizeMB(256.0);
	      IndexWriter writer = new IndexWriter(dir, iwc);
	      this.ACT002_indexDocs(writer, new File(dirPath_docs));
	      // NOTE: if you want to maximize search performance,
	      // you can optionally call forceMerge here.  This can be
	      // a terribly costly operation, so generally it's only
	      // worth it when your index is relatively static (ie
	      // you're done adding documents to it):
	      //
	      // writer.forceMerge(1);
	      writer.close();
	      Date end = new Date();
	      System.out.println(end.getTime() - start.getTime() + " total milliseconds");
	    }
	    catch (IOException e) 
	    {
	      System.out.println(" caught a " + e.getClass() + "\n with message: " + e.getMessage());
	    }
  }
  public void ACT002_indexDocs(IndexWriter writer, File file) throws IOException 
  {
		        FileInputStream fis = null;
			    BufferedInputStream bis = null;
			    DataInputStream dis = null;
			    String read_product = null, read_title = null;
		        try 
		        {
		            fis = new FileInputStream(file);
			        bis = new BufferedInputStream(fis);
			        dis = new DataInputStream(bis);
			        while (dis.available() != 0)
			        {
			        	read_product = dis.readLine();
			        	read_title = dis.readLine();
			        	Document doc = new Document();
			        	Field pathField = new StringField("path", read_product, Field.Store.YES);
				        doc.add(pathField);
				        doc.add(new TextField("contents",read_title, Field.Store.YES));
				          if (writer.getConfig().getOpenMode() == OpenMode.CREATE) {
					            // New index, so we just add the document (no old document can be there):
					            System.out.println("adding " + read_product);
					            writer.addDocument(doc);
					          } else {
					           // Existing index (an old copy of this document may have been indexed) so 
					            // we use updateDocument instead to replace the old one matching the exact 
					            // path, if present:
					            System.out.println("updating " + read_product);
					            writer.updateDocument(new Term("path", read_product), doc);
					          }
			        }
		        } 
		        catch (FileNotFoundException fnfe) 
		        {
		          // at least on windows, some temporary files raise this exception with an "access denied" message
		          // checking if the file can be read doesn't help
		          return;
		        }
		        finally
		        {
		        	dis.close();
		        	bis.close();
		        	fis.close();
		        }
  }
  /** Index all text files under a directory. */
  public static void main(String[] args) 
  {
	  LineIndexMaker IM = new LineIndexMaker();
	  IM.ACT001_doIndex("/home/believe2/桌面/ppd", "/home/believe2/桌面/index");
  }
}
